[SECTION .text]

global memcpy
global memset
global strcpy

; 函数功能：拷贝内存，相当于C语言的memcpy
; 从ds段，拷贝到es段，源便宜地址esi，第二个参数，目的偏移是edi，第一个参数。
; 函数返回目的便宜地址。
memcpy:
	push ebp
	mov ebp, esp
	
	push esi
	push edi
	push ecx
	
	mov edi, [ebp + 8]
	mov esi, [ebp + 12]
	mov ecx, [ebp + 16]
	
.1:
	cmp ecx, 0
	jz .2
	
	mov al, byte [ds:esi]
	inc esi
	mov byte [es:edi], al
	inc edi
	
	dec ecx
	jmp .1
	
.2:
	mov eax, [ebp + 8]
	
	pop ecx
	pop edi
	pop esi
	mov esp, ebp
	pop ebp
	
	ret

; 函数功能，将内存设置为指定的字符
; void memset(void* p_dst, char ch, int size);
memset:
	push ebp
	mov ebp, esp

	push edi
	push ecx

	mov edi, dword [ebp + 8]
	mov ecx, dword [ebp + 16]
	mov eax, dword [ebp + 12]

	cmp ecx, 0
	jz .2
	
.1:
	mov byte [es:edi], al
	inc edi
	loop .1

.2:
	pop ecx
	pop edi


	mov esp, ebp
	pop ebp
	ret

; char* strcpy(char* p_dst, char * p_src)
strcpy:
	push ebp
	mov ebp, esp

	mov esi, [ebp + 12]
	mov edi, [ebp + 8]
.1:
	mov al, [esi]
	inc esi

	mov byte [edi], al
	inc edi

	cmp al, 0
	jnz .1

	mov eax, [ebp + 8]

	pop ebp
	ret